跳到主要内容

object、Object以及{}的区别

在 TypeScript 中,objectObject{} 都与“对象”相关,但它们的含义和使用场景有重要区别。以下是它们的详细解释:

1. object

  • 定义:这是 TypeScript 2.2 引入的一个原始类型 (primitive type),表示“非原始类型”的值,即不是 stringnumberbooleansymbolnullundefined 的类型。
  • 特点
    • 表示所有非原始类型的对象,包括普通对象、数组、函数、Date 等。
    • 不能访问任何属性或方法(因为它没有预定义的结构)。
  • 用途:当你只想确保一个值是一个对象(而不是原始值)时使用。
  • 示例
let a: object;
a = { name: 'Alice' }; // OK
a = []; // OK
a = () => {}; // OK
a = 'hello'; // Error: 不能将 string 赋值给 object
a.name; // 类型“object”上不存在属性“name”。

2. Object

  • Object 是 TypeScript 中表示 “任何非原始类型的值” 的类型。
  • 它来源于 JavaScript 的全局构造函数 Object
  • 在类型系统中,Object 类型包含所有对象、数组、函数、日期、正则等(即 typeof x === 'object''function' 的值)。
  • 注意:由于其过于宽泛,通常不推荐使用 Object,建议使用更具体的类型。
  • 示例
let b: Object;
b = { name: 'Alice' }; // OK
b = []; // OK
b = 'hello'; // OK
b = 12; // OK
b = null; // 不能将类型“null”分配给类型“Object”。
b.name; //类型“Object”上不存在属性“name”。
const obj: Object = { name: 'Tom' };
const arr: Object = [1, 2, 3];
const fn: Object = () => {};
const date: Object = new Date();

这些赋值都是合法的,因为它们都不是原始类型(stringnumberboolean 等)。

3. {}

  • 定义:表示一个没有任何自身属性的对象类型。它描述的是“空对象字面量” {} 的结构。
  • 特点
    • 可以赋值给任何包含或不包含属性的对象(因为对象可以有额外属性)。
    • 不能访问任何属性(因为类型系统认为它没有属性)。
    • nullundefined 不能赋值给 {}(除非 strictNullChecks 关闭)。
  • 常见误解{} 并不表示“任意对象”,而是“没有属性的对象”。
  • 示例
let c: {};
c = {}; // OK
c = { name: 'Alice' }; // OK(结构兼容)
c = []; // OK(数组也是对象)
c = 12;
c = null; // 不能将类型“null”分配给类型“{}”
c.name; // 类型“{}”上不存在属性“name”。

总结对比

类型是否可访问属性是否包含原始类型是否包含 null/undefined推荐使用场景
object❌ 否❌ 否✅ 取决于配置确保值是对象(非原始值)
Object❌ 否✅ 是(宽泛)❌ 否避免使用,过于宽泛
{}❌ 否✅ 是❌ 否(严格模式)很少直接使用,常用于泛型约束

最佳实践

  • 使用 object 来表示“非原始值”。
  • 避免使用 Object,除非与旧代码兼容。
  • 使用 {} 要小心,它不是“任意对象”,而是“无属性对象”。
  • 更推荐使用具体接口或类型,如 Record<string, any>unknown 来表示任意对象。